home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / superpac.c < prev    next >
C/C++ Source or Header  |  2000-04-27  |  5KB  |  268 lines

  1. /***************************************************************************
  2.  
  3.   machine.c
  4.  
  5.   Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
  6.   I/O ports)
  7.  
  8. ***************************************************************************/
  9.  
  10. #include "driver.h"
  11.  
  12.  
  13. unsigned char *superpac_sharedram;
  14. unsigned char *superpac_customio_1,*superpac_customio_2;
  15.  
  16. static int coin1, coin2, credits, start1, start2;
  17.  
  18. static int crednum[] = { 1, 2, 3, 6, 7, 1, 3, 1 };
  19. static int credden[] = { 1, 1, 1, 1, 1, 2, 2, 3 };
  20.  
  21. void superpac_init_machine(void)
  22. {
  23.     /* Reset all flags */
  24.     coin1 = coin2 = start1 = start2 = credits = 0;
  25. }
  26.  
  27.  
  28. READ_HANDLER( superpac_sharedram_r )
  29. {
  30.     return superpac_sharedram[offset];
  31. }
  32.  
  33. WRITE_HANDLER( superpac_sharedram_w )
  34. {
  35.     superpac_sharedram[offset] = data;
  36. }
  37.  
  38.  
  39. WRITE_HANDLER( superpac_reset_2_w )
  40. {
  41.     cpu_set_reset_line(1,PULSE_LINE);
  42. }
  43.  
  44.  
  45. void superpac_update_credits (void)
  46. {
  47.     int val = readinputport (3) & 0x0f, temp;
  48.     if (val & 1)
  49.     {
  50.         if (!coin1) credits++, coin1++;
  51.     }
  52.     else coin1 = 0;
  53.  
  54.     if (val & 2)
  55.     {
  56.         if (!coin2) credits++, coin2++;
  57.     }
  58.     else coin2 = 0;
  59.  
  60.     temp = readinputport (1) & 7;
  61.     val = readinputport (3) >> 4;
  62.     if (val & 1)
  63.     {
  64.         if (!start1 && credits >= credden[temp]) credits -= credden[temp], start1++;
  65.     }
  66.     else start1 = 0;
  67.  
  68.     if (val & 2)
  69.     {
  70.         if (!start2 && credits >= 2 * credden[temp]) credits -= 2 * credden[temp], start2++;
  71.     }
  72.     else start2 = 0;
  73. }
  74.  
  75.  
  76. READ_HANDLER( superpac_customio_1_r )
  77. {
  78.     int val, temp;
  79.  
  80.     /* default return value */
  81.     val = superpac_customio_1[offset];
  82.  
  83.     superpac_update_credits();
  84.  
  85.     switch (superpac_customio_1[8])
  86.     {
  87.     /* mode 1 & 3 are used by Pac & Pal, and returns actual important values */
  88.     case 1:
  89.     case 3:
  90.         switch (offset)
  91.         {
  92.         case 0:
  93.             val = readinputport (3) & 0x0f;
  94.             break;
  95.  
  96.         case 1:
  97.             val = readinputport (2) & 0x0f;
  98.             break;
  99.  
  100.         case 2:
  101.             val = readinputport (4) & 0x0f;
  102.             break;
  103.  
  104.         case 3:
  105.             val = (readinputport (3) >> 4) & 3;
  106.             val |= val << 2;
  107.  
  108.             /* I don't know the exact mix, but the low bit is used both for
  109.                the fire button and for player 1 start; I'm just ORing for now */
  110.             val |= readinputport (2) >> 4;
  111.             break;
  112.  
  113.         case 4:
  114.         case 5:
  115.         case 6:
  116.         case 7:
  117.             val = 0x0f;
  118.             break;
  119.         }
  120.  
  121.         break;
  122.  
  123.     /* mode 4 is the standard, and returns actual important values */
  124.     case 4:
  125.         switch (offset)
  126.         {
  127.         case 0:
  128.             temp = readinputport (1) & 7;
  129.             val = (credits * crednum[temp] / credden[temp]) / 10;
  130.             break;
  131.  
  132.         case 1:
  133.             temp = readinputport (1) & 7;
  134.             val = (credits * crednum[temp] / credden[temp]) % 10;
  135.             break;
  136.  
  137.         case 4:
  138.             val = readinputport (2) & 0x0f;
  139.             break;
  140.  
  141.         case 5:
  142.             val = readinputport (2) >> 4;
  143.             break;
  144.  
  145.         case 6:
  146.             val = readinputport (4) & 0x0f;
  147.             break;
  148.  
  149.         case 7:
  150.             val = readinputport (4) >> 4;
  151.             break;
  152.         }
  153.  
  154.         break;
  155.  
  156.     /* mode 8 is the test mode: always return 0 for these locations */
  157.     case 8:
  158.         credits = 0;
  159.         if (offset >= 9 && offset <= 15)
  160.             val = 0;
  161.         break;
  162.     }
  163.  
  164.     return val;
  165. }
  166.  
  167.  
  168. READ_HANDLER( superpac_customio_2_r )
  169. {
  170.     int val;
  171.  
  172.     /* default return value */
  173.     val = superpac_customio_2[offset];
  174.  
  175.     switch (superpac_customio_2[8])
  176.     {
  177.     /* mode 3 is the standard for Pac & Pal, and returns actual important values */
  178.     case 3:
  179.         switch (offset)
  180.         {
  181.         case 0:
  182.         case 1:
  183.         case 2:
  184.         case 3:
  185.             val = 0;
  186.             break;
  187.  
  188.         case 4:
  189.             val = readinputport (0) & 0x0f;
  190.             break;
  191.  
  192.         case 5:
  193.             val = readinputport (1) >> 4;
  194.             break;
  195.  
  196.         case 6:
  197.             val = readinputport (1) & 0x0f;
  198.             break;
  199.  
  200.         case 7:
  201.             val = (readinputport (3) >> 4) & 0x0c;
  202.             break;
  203.         }
  204.  
  205.         break;
  206.  
  207.     /* mode 9 is the standard, and returns actual important values */
  208.     case 9:
  209.         switch (offset)
  210.         {
  211.         case 0:
  212.             val = readinputport (1) & 0x0f;
  213.             break;
  214.  
  215.         case 1:
  216.             val = readinputport (1) >> 4;
  217.             break;
  218.  
  219.         case 2:
  220.             val = 0;
  221.             break;
  222.  
  223.         case 3:
  224.             val = readinputport (0) & 0x0f;
  225.             break;
  226.  
  227.         case 4:
  228.             val = readinputport (0) >> 4;
  229.             break;
  230.  
  231.         case 5:
  232.             val = 0;
  233.             break;
  234.  
  235.         case 6:
  236.             val = (readinputport (3) >> 4) & 0x0c;
  237.             break;
  238.  
  239.         case 7:
  240.             val = 0;
  241.             break;
  242.         }
  243.  
  244.         break;
  245.  
  246.     /* mode 8 is the test mode: always return 0 for these locations */
  247.     case 8:
  248.         credits = 0;
  249.         if (offset >= 9 && offset <= 15)
  250.             val = 0;
  251.         break;
  252.     }
  253.  
  254.     return val;
  255. }
  256.  
  257.  
  258. WRITE_HANDLER( superpac_interrupt_enable_w )
  259. {
  260.     interrupt_enable_w(0, offset);
  261. }
  262.  
  263.  
  264. WRITE_HANDLER( superpac_cpu_enable_w )
  265. {
  266.     cpu_set_halt_line(1, offset ? CLEAR_LINE : ASSERT_LINE);
  267. }
  268.